#include "widget_funcf_control_motor.h"
#include "ui_widget_funcf_control_motor.h"
#include <QPainter>
#include <QMessageBox>
#include <QMouseEvent>
#include <QIcon>
#include <QLabel>
#include <QVBoxLayout> 
#include <QPushButton>

Widget_funcF_Control_motor::Widget_funcF_Control_motor(QWidget *parent) : QWidget(parent), isBlackTurn(true), hoverPos(-1, -1)
{   
    //修改系统图标
    Window_icon = new QIcon(":/游戏");  
    this->setWindowIcon(*Window_icon);
    
    setFixedSize(600, 600);
    setWindowTitle("五子棋");
    setMouseTracking(true);  // 允许捕获鼠标移动
    
    // 初始化棋盘
    board.resize(15);
    for(auto &row : board) {
        row.resize(15);
        row.fill(0);
    }
}

void Widget_funcF_Control_motor::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);  // 抗锯齿
    
    // 绘制棋盘网格
    painter.setPen(Qt::black);
    for(int i = 0; i < 15; i++) {
        // 横线 - 修正终点坐标
        painter.drawLine(30, 30 + i * 40, 590, 30 + i * 40);
        // 竖线 - 修正终点坐标
        painter.drawLine(30 + i * 40, 30, 30 + i * 40, 590);
    }
    // 绘制棋子
    for(int i = 0; i < 15; i++) {
        for(int j = 0; j < 15; j++) {
            if(board[i][j] == 1) {  // 黑棋
                painter.setBrush(Qt::black);
                painter.drawEllipse(30 + j * 40 - 15, 30 + i * 40 - 15, 30, 30);
            }
            else if(board[i][j] == 2) {  // 白棋
                painter.setBrush(Qt::white);
                painter.setPen(QPen(Qt::black, 1));  // 白棋加黑色边框
                painter.drawEllipse(30 + j * 40 - 15, 30 + i * 40 - 15, 30, 30);
                painter.setPen(Qt::black);  // 恢复画笔
            }
        }
    }
    
    // 绘制鼠标悬停提示（仅当该位置为空时）
    if(hoverPos.x() >= 0 && hoverPos.y() >= 0 && 
       hoverPos.x() < 15 && hoverPos.y() < 15 && 
       board[hoverPos.y()][hoverPos.x()] == 0) {
        painter.setPen(QPen(isBlackTurn ? Qt::gray : Qt::lightGray, 2, Qt::DashLine));
        painter.setBrush(Qt::NoBrush);
        painter.drawRect(30 + hoverPos.x() * 40 - 20, 30 + hoverPos.y() * 40 - 20, 40, 40);
    }
}
//void Widget_funcF_Control_motor::paintEvent(QPaintEvent *event)
//{
//    QPainter painter(this);
//    painter.setRenderHint(QPainter::Antialiasing, true);
    
//    // 调整后的参数（整体减少20像素）
//    const int margin = 20;  // 原30减为20
//    const int gridSize = 36; // 原40减为36（保持14个间隔）
//    const int pieceRadius = 13; // 原15减为13
    
//    // 绘制棋盘网格
//    painter.setPen(Qt::black);
//    for(int i = 0; i < 15; i++) {
//        // 横线
//        painter.drawLine(margin, margin + i * gridSize, 
//                       margin + 14 * gridSize, margin + i * gridSize);
//        // 竖线
//        painter.drawLine(margin + i * gridSize, margin,
//                       margin + i * gridSize, margin + 14 * gridSize);
//    }
    
//    // 绘制棋子
//    for(int i = 0; i < 15; i++) {
//        for(int j = 0; j < 15; j++) {
//            if(board[i][j] == 1) {  // 黑棋
//                painter.setBrush(Qt::black);
//                painter.drawEllipse(margin + j * gridSize - pieceRadius, 
//                                   margin + i * gridSize - pieceRadius, 
//                                   pieceRadius * 2, pieceRadius * 2);
//            }
//            else if(board[i][j] == 2) {  // 白棋
//                painter.setBrush(Qt::white);
//                painter.setPen(QPen(Qt::black, 1));
//                painter.drawEllipse(margin + j * gridSize - pieceRadius,
//                                  margin + i * gridSize - pieceRadius,
//                                  pieceRadius * 2, pieceRadius * 2);
//                painter.setPen(Qt::black);
//            }
//        }
//    }
//}

void Widget_funcF_Control_motor::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton) {
        // 将鼠标坐标转换为棋盘格子坐标
        int x = (event->x() - 30 + 20) / 40;  // +20是为了靠近中心
        int y = (event->y() - 30 + 20) / 40;
        
        // 边界检查
        if(x < 0) x = 0;
        if(x >= 15) x = 14;
        if(y < 0) y = 0;
        if(y >= 15) y = 14;
        
        // 检查该位置是否已落子
        if(board[y][x] == 0) {
            board[y][x] = isBlackTurn ? 1 : 2;  // 1:黑棋，2:白棋
            update();  // 触发重绘
            
            // 检查是否获胜
            if(checkWin(QPoint(x, y))) {
                QMessageBox::information(this, "游戏结束", 
                    isBlackTurn ? "黑棋获胜！" : "白棋获胜！");
                showWinDialog();
                resetGame();  // 重置游戏
                return;
            }
            
            isBlackTurn = !isBlackTurn;  // 切换玩家
        }
    }
}

void Widget_funcF_Control_motor::mouseMoveEvent(QMouseEvent *event)
{
    // 更新悬停位置
    int x = (event->x() - 30 + 20) / 40;
    int y = (event->y() - 30 + 20) / 40;
    
    if(x >= 0 && x < 15 && y >= 0 && y < 15) {
        hoverPos = QPoint(x, y);
    } else {
        hoverPos = QPoint(-1, -1);  // 超出棋盘范围
    }
    update();  // 更新悬停提示
}

void Widget_funcF_Control_motor::leaveEvent(QEvent *event)
{
    // 鼠标离开时清除悬停提示
    hoverPos = QPoint(-1, -1);
    update();
}

bool Widget_funcF_Control_motor::checkWin(QPoint pos)
{
    int current = board[pos.y()][pos.x()];
    int count;
    
    // 检查方向的辅助lambda函数
    auto checkDirection = [this, current, &pos](int dx, int dy) {
        int count = 1;
        // 正向检查
        for(int i = 1; i < 5; i++) {
            int nx = pos.x() + i * dx;
            int ny = pos.y() + i * dy;
            if(nx >= 0 && nx < 15 && ny >= 0 && ny < 15 && board[ny][nx] == current) {
                count++;
            } else {
                break;
            }
        }
        // 反向检查
        for(int i = 1; i < 5; i++) {
            int nx = pos.x() - i * dx;
            int ny = pos.y() - i * dy;
            if(nx >= 0 && nx < 15 && ny >= 0 && ny < 15 && board[ny][nx] == current) {
                count++;
            } else {
                break;
            }
        }
        return count >= 5;
    };
    
    // 检查四个方向
    if(checkDirection(1, 0)) return true;  // 水平
    if(checkDirection(0, 1)) return true;  // 垂直
    if(checkDirection(1, 1)) return true;  // 主对角线
    if(checkDirection(1, -1)) return true; // 副对角线
    
    return false;
}

void Widget_funcF_Control_motor::resetGame()
{
    // 重置游戏状态
    board.clear();
    board.resize(15);
    for(auto &row : board) {
        row.resize(15);
        row.fill(0);
    }
    isBlackTurn = true;
    hoverPos = QPoint(-1, -1);
    update();
}

//展示胜利
void Widget_funcF_Control_motor::showWinDialog() {
    QDialog dialog(this);
    //设置弹窗大小
    dialog.setFixedSize(210, 210);
    dialog.setWindowTitle("胜利");
    dialog.setWindowIcon(QIcon(":/胜利奖杯"));
 
    QVBoxLayout *layout = new QVBoxLayout(&dialog);
    QLabel *icon = new QLabel();
    icon->setPixmap(QPixmap(":/玩家胜利").scaled(60, 60));
    icon->setAlignment(Qt::AlignCenter);
    layout->addWidget(icon);
 
    QLabel *message = new QLabel("你赢了！");
    message->setAlignment(Qt::AlignCenter);
    layout->addWidget(message);
 
    QPushButton *okButton = new QPushButton("确定");
    connect(okButton, &QPushButton::clicked, &dialog, &QDialog::accept);
    layout->addWidget(okButton);
 
    dialog.exec();
}
